﻿#define _CRT_SECURE_NO_WARNINGS 1
//strstr的使⽤和模拟实现
//char * strstr (char * str1 //str1是被搜索的字符串
//			, const char * str2)//str2存放的是要搜索字符串的内容
//首次搜索传入的str1是要被搜索的字符串
//后序还要查找就传入NULL指针
//char*返回值是，如果找到了子串就返回匹配子串的起始地址，没有找到匹配的子串就返回NULL指针

//#include<stdio.h>
//#include<string.h>
//#include<assert.h>
//
//char* my_strstr(char* str1, const char* str2)
//{
//	assert(*str1 != NULL && *str2 != NULL);
//
//	char* Find1 = str1;
//	char* tmp = str1;
//	char* Find2 = str2;
//	while (*Find1 != '\0')
//	{
//		tmp = Find1;
//		Find2 = str2;
//
//		while (*tmp != '\0' && *Find2 != '\0' && *tmp == *Find2)
//		{
//			tmp++;
//			Find2++;
//		}
//
//		if (*tmp != '\0' && *Find2 == '\0')
//			return Find1;
//
//		Find1++;
//	}
//
//	if (*Find1 == '\0')
//		return NULL;
//}
//
//int main()
//{
//	//1.开头就匹配到了，比如str1 = "abcdef"; str2 = "abc";
//	//2.第一次找到匹配的但后序没有匹配成功，需要重新找，比如str1 = "abbbcef"; str2 = "bbc";
//	//3.没有找到子串的情况，返回NULL，比如str1 = "abcdef"; str2 = "abq";
//
//	char str1[] = "abcdef";
//	char str2[] = "abq";
//	char tmp[20] = { 0 };
//	strcpy(tmp, str1);
//	char* ret = my_strstr(tmp, str2);
//	if (ret == NULL)
//		printf("(null)");
//	else
//		printf("%s\n", ret);
//
//
//	return 0;
//}

//strtok函数的使⽤
// 1.strtok的功能是在一个字符串里的符号如果在分割符字符串里出现就将分隔符前面的字符串的地址返回
// 2.strtok第一次分割后，第二次再进行分割第一个参数只需要传入NULL指针即可，可以理解为strtok用了static修饰符
// 3.需要注意的是strtok会改变第一个参数str的内容，使用strtok库函数时，需要将源字符串进行拷贝后传递拷贝的地址给库函数即可
//char* strtok(char* str //str是字符串
//			, const char* delimiters
//				);

//#include<stdio.h>
//#include<string.h>
//
//int main()
//{
//	char str1[] = "2239555724@qq.com";
//	char* str2 = "@.";
//	char* tmp = str1;
//	/*char* ret = strtok(tmp, str2);
//	printf("%s\n", ret);
//	ret = strtok(NULL, str2);
//	printf("%s\n", ret);
//	ret = strtok(NULL, str2);
//	printf("%s\n", ret);
//	ret = strtok(NULL, str2);
//	printf("%s\n", ret);*/
//	//上面的打印方法过于繁琐，根据strtok库函数的参数传递的地点，
//	// 刚好与for循环的特点适配，所以可以采用for循环来解决打印的问题
//	char* ret = NULL;
//	for (ret = strtok(tmp, str2); ret != NULL; ret = strtok(NULL, str2))
//	{
//		printf("%s\n", ret);
//	}
//	
//
//	return 0;
//}

//strerror函数的使⽤
//在程序启动期间全局会有一个全局变量errno来存放错误码
//错误码有0~10
//strerror就是用来将这些数字转换成字符串的形式返回给开发人员
//#include<stdio.h>
//#include<string.h>
//#include<errno.h>
//
//int main()
//{
//	//int i = 0;
//	//for (i = 0; i < 11; i++)
//	//{
//	//	printf("%d : %s\n", i, strerror(i));
//	//}
//
//	//错误码的作用
//	FILE* pFile;
//	pFile = fopen("test.txt", "r");//目录下没有test.txt这个文件就会读取失败返回NULL指针
//	if (pFile == NULL)
//	{
//		//读取失败
//		//printf("%s\n", strerror(errno));
//		perror("test.txt");
//		//用perror库函数比strerror更加方便
//		//1.perror内部有调用printf无需在外边写
//		//2.perror可以添加额外内容进去，并且添加的额外内容的后面库函数会自动添加: (一个冒号和一个空格)再打印错误信息
//	}
//
//	return 0;
//}


//memcpy 使⽤和模拟实现
//memcpy是一个按字节拷贝的库函数
//void * memcpy ( 
//				void * destination, //目标字符串 
//				const void * source, //源字符串
//				size_t num //要拷贝的总字节数
//				);

#include<stdio.h>
#include<string.h>

void Print(int* arr, int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
//
//void* my_memcpy(void* dest, const void* src, size_t num)
//{
//	void* tmp = dest;
//	while (num--)
//	{
//		*((char*)dest)++ = *((char*)src)++;
//	}
//
//	return tmp;
//}
//
//int main()
//{
//	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int arr2[10] = { 0 };
//	//memcpy(arr2, arr1, 12);//拷贝前三个数据
//	//my_memcpy(arr2, arr1, 20);//拷贝前5个数据
//	//my_memcpy(arr1+3, arr1, 20);
//	memcpy(arr1+3, arr1, 20);//memcpy无法用于同一个空间内的拷贝，如果要进行同一个空间的拷贝请使用memmove
//
//	Print(arr1, 10);
//
//	return 0;
//}


//memmove 使⽤和模拟实现
//void * memmove ( void * destination, const void * source, size_t num )

//void* my_memmove(void* dest, const void* src, int num)
//{
//	void* tmp = dest;
//
//	if (dest > src)
//	{
//		while (num--)
//		{
//			*((char*)dest)++ = *((char*)src)++;
//		}
//	}
//	else
//	{
//		while (num--)
//		{
//			*((char*)dest+num) = *((char*)src+num);
//		}
//	}
//
//	return tmp;
//}
//
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	//memmove(arr + 3, arr, 12);//可以从前向后操作
//	//memmove(arr, arr+3, 12);//也能从后先前操作
//	
//	//my_memmove(arr + 3, arr, 12);//可以从前向后操作
//	my_memmove(arr, arr+3, 12);//也能从后先前操作
//
//	Print(arr, 10);
//
//	return 0;
//}

//memset函数的使⽤
//memset的功能是，按字节设置对应的数字
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	Print(arr, 10);
//	memset(arr, 0, 40);//将全部内容设置为0
//	Print(arr, 10);
//
//	return 0;
//}

//memcmp函数的使⽤
//按字节进行比较
//参数1 > 参数2 就返回大于0的数字
//参数1 < 参数2 就返回小于0的数字
//参数1 == 参数2 就返回0
int main()
{
	int p1 = 0x66552211;
	int p2 = 0x44552211;
	//int r = memcmp(&p1, &p2, 2); // 参数1-> 0x44332211 参数2-> 0x44552211  前两个字节相等返回0
	//int r = memcmp(&p1, &p2, 3); // 参数1-> 0x44332211 参数2-> 0x44552211 第三个字节 参数1 < 参数2 返回小于0的数字
	int r = memcmp(&p1, &p2, 4); //   参数1-> 0x66552211 参数2-> 0x44552211 第四个字节 参数1 > 参数2 返回大于0的数字
	printf("%d\n", r);

	return 0;
}

